home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 001 / pibcalc.arc / ARITH.PAS next >
Pascal/Delphi Source File  |  1985-03-08  |  8KB  |  268 lines

  1. (*--------------------------------------------------------------------------*)
  2. (*                  ARITH.PAS --- basic arithmetic routines                 *)
  3. (*                                                                          *)
  4. (*    Routines included:                                                    *)
  5. (*                                                                          *)
  6. (*       AddVals  --- add two values                                        *)
  7. (*       SubVals  --- subtract two values                                   *)
  8. (*       MulVals  --- multiply two values                                   *)
  9. (*       DivVals  --- divide two real values                                *)
  10. (*       IdivVals --- Integer divide                                        *)
  11. (*       ModVals  --- MOD operation                                         *)
  12. (*       PowVals  --- exponentiation operation                              *)
  13. (*                                                                          *)
  14. (*--------------------------------------------------------------------------*)
  15.  
  16.  
  17. (*--------------------------------------------------------------------------*)
  18. (*                     AddVals --- Add two values                           *)
  19. (*--------------------------------------------------------------------------*)
  20.  
  21. PROCEDURE AddVals( VAR a , b : valuety );
  22.  
  23. VAR
  24.    k: INTEGER;
  25.  
  26. BEGIN (* AddVals *)
  27.  
  28.    WITH a DO
  29.                                    (* Integer result *)
  30.  
  31.       IF ( typ = INT ) AND ( b.typ = INT ) THEN
  32.          BEGIN
  33.             i := i + b.i;
  34.             k := i;
  35.             r := k;
  36.          END
  37.       ELSE                         (* Real result *)
  38.          BEGIN
  39.             i   := 0;
  40.             r   := r + b.r;
  41.             typ := rea;
  42.          END
  43.  
  44. END  (* AddVals *);
  45.  
  46. (*--------------------------------------------------------------------------*)
  47. (*                    SubVals --- Subtract two values                       *)
  48. (*--------------------------------------------------------------------------*)
  49.  
  50. PROCEDURE SubVals( VAR a , b : valuety );
  51.  
  52. VAR
  53.    k: INTEGER;
  54.  
  55. BEGIN  (* SubVals *)
  56.  
  57.    WITH a DO
  58.       IF ( typ = INT ) AND ( b.typ = INT ) THEN
  59.  
  60.          BEGIN                     (* Integer result *)
  61.             i := i - b.i;
  62.             k := i;
  63.             r := k;
  64.          END
  65.       ELSE
  66.          BEGIN                     (* Real result *)
  67.             i   := 0;
  68.             r   := r - b.r;
  69.             typ := rea;
  70.          END;
  71.  
  72. END   (* SubVals *);
  73.  
  74. (*--------------------------------------------------------------------------*)
  75. (*                    MulVals --- Multiply two values                       *)
  76. (*--------------------------------------------------------------------------*)
  77.  
  78. PROCEDURE MulVals( VAR a , b : valuety );
  79.  
  80. VAR
  81.    k: INTEGER;
  82.  
  83. BEGIN  (* MulVals *)
  84.  
  85.    WITH a DO
  86.       IF ( typ = INT ) AND ( b.typ = INT ) THEN
  87.  
  88.          BEGIN                     (* Integer result *)
  89.             i := i * b.i;
  90.             k := i;
  91.             r := k;
  92.          END
  93.       ELSE
  94.          BEGIN                     (* Real result *)
  95.             i   := 0;
  96.             r   := r * b.r;
  97.             typ := rea;
  98.          END;
  99.  
  100. END   (* MulVals *);
  101.  
  102. (*--------------------------------------------------------------------------*)
  103. (*                   RdivVals --- Divide two values (real division)         *)
  104. (*--------------------------------------------------------------------------*)
  105.  
  106. PROCEDURE RdivVals( VAR a , b : valuety );
  107.  
  108. BEGIN  (* RdivVals *)
  109.  
  110.    WITH a DO
  111.       BEGIN
  112.                                    (* Issue error on zero divide *)
  113.          IF b.r = 0.0 THEN
  114.             Error('Division by zero')
  115.          ELSE
  116.             BEGIN
  117.                i   := 0;
  118.                r   := r / b.r;
  119.                typ := rea;
  120.             END;
  121.  
  122.       END;
  123.  
  124. END  (* RdivVals *);
  125.  
  126. (*--------------------------------------------------------------------------*)
  127. (*               IdivVals --- Divide two values (integer division)          *)
  128. (*--------------------------------------------------------------------------*)
  129.  
  130. PROCEDURE IdivVals( VAR a , b : valuety );
  131.  
  132. VAR
  133.    k: INTEGER;
  134.  
  135. BEGIN (* IdivVals *)
  136.  
  137.    WITH a DO
  138.       BEGIN
  139.                                    (* Ensure both operands are integers *)
  140.  
  141.          IF ( typ <> INT ) OR ( b.typ <> INT ) THEN
  142.             Error('DIV operands must both be integers')
  143.          ELSE
  144.             BEGIN                  (* Check for zero divide *)
  145.                IF b.i = 0 THEN
  146.                   Error ('Division by zero')
  147.                ELSE
  148.                   BEGIN
  149.  
  150.                      i := i DIV b.i;
  151.                      k := i;
  152.                      r := k;
  153.  
  154.                   END;
  155.  
  156.             END;
  157.  
  158.       END;
  159.  
  160. END  (* IdivVals *);
  161.  
  162. (*--------------------------------------------------------------------------*)
  163. (*                      ModVals --- MOD operation                           *)
  164. (*--------------------------------------------------------------------------*)
  165.  
  166. PROCEDURE ModVals( VAR a , b : valuety );
  167.  
  168. VAR
  169.    k: INTEGER;
  170.  
  171. BEGIN (* ModVals *)
  172.  
  173.    WITH a DO
  174.       BEGIN
  175.                                    (* Ensure both operands are integers *)
  176.  
  177.          IF ( typ <> INT ) OR ( b.typ <> INT ) THEN
  178.             Error('MOD operands must both be integers')
  179.  
  180.          ELSE                      (* Don't allow MOD 0 *)
  181.             BEGIN
  182.                IF b.i = 0 THEN
  183.                   error ('MOD 0 illegal')
  184.                ELSE
  185.                   BEGIN
  186.  
  187.                      i := i MOD b.i;
  188.                      k := i;
  189.                      r := k;
  190.  
  191.                   END;
  192.  
  193.            END;
  194.  
  195.       END;
  196.  
  197. END  (* ModVals *);
  198.  
  199. (*--------------------------------------------------------------------------*)
  200. (*                   PowVals --- exponentiation operation                   *)
  201. (*--------------------------------------------------------------------------*)
  202.  
  203. PROCEDURE PowVals( VAR a , b : valuety );
  204.  
  205. VAR
  206.    k: INTEGER;
  207.  
  208. BEGIN (* Powvals *)
  209.  
  210.    WITH a DO
  211.       BEGIN
  212.  
  213.          i := 0;
  214.  
  215.          CASE b.typ OF
  216.                                    (* Power is integer *)
  217.             INT: BEGIN
  218.                                    (* Don't allow 0 ** (<= 0) *)
  219.  
  220.                     IF r = 0.0 THEN IF b.i <= 0 THEN
  221.                        Error('Bad arguments for exponentiation')
  222.                     ELSE
  223.                        BEGIN
  224.  
  225.                           r := PowerI( r , b.i );
  226.  
  227.                                    (* Round if integer result required *)
  228.  
  229.                           IF ( typ = INT ) AND ( b.i >= 0 ) THEN
  230.                              BEGIN
  231.                                 i := ROUND(r);
  232.                                 k := i;
  233.                                 r := k;
  234.                              END
  235.                           ELSE
  236.                              typ := rea;
  237.  
  238.                        END;
  239.  
  240.                  END;
  241.                                    (* Real exponent *)
  242.  
  243.             rea: BEGIN  (* REA *)
  244.  
  245.                                    (* Don't allow 0 ** ( <= 0 ), or *)
  246.                                    (* (<= 0) ** ( <= 0 )            *)
  247.  
  248.                     IF r < 0.0 THEN
  249.                        Error('Bad arguments for exponentiation')
  250.                     ELSE IF r = 0.0 THEN IF b.r <= 0.0 THEN
  251.                        Error('Bad arguments for exponentiation')
  252.                     ELSE
  253.                        BEGIN
  254.  
  255.                           r   := Power( r , b.r );
  256.                           typ := rea;
  257.  
  258.                        END (* IF *)
  259.  
  260.                  END  (* REA *)
  261.  
  262.          END  (*  CASE *)
  263.  
  264.    END  (* WITH *)
  265.  
  266. END (* POWVALS *);
  267.  
  268.